package com.moon.interface_api.utils;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;

/**
 *Created by chengliang on 2019/5/14.
 */
public class Text2ImageUtils {

    private final static int fontSize = 34;
    private final static double rowSpace = 1.5;
    private static int yNum = (int)(fontSize * rowSpace);
    private static int xNum = 34;
    private final static int width = 693;
    private final static int height = 1000;

    /**
     * 根据str生成图片 是以 /n 来识别段落的，其他的就有自动换行，数字有一定的丑陋
     * @param str	字符串
     */
    public static String createImage(String str) throws IOException {
        StringBuilder sb = new StringBuilder("");
        // 创建图片
        BufferedImage image = getImg();
        Graphics g = null;
        //3.将文字写到图片上，并记录写到的位置
        //3.1 文字的位置
        int number = 1;
        int x = 0;
        int y = 1;
        char[] chars = str.toCharArray();
        //3.2开始写
        g = getGraphics(image);
        for (int i = 0; i < chars.length; i++) {
            if(chars[i] >= 48 && chars[i]<= 57){
            }
            g.drawString(String.valueOf(chars[i]), xNum*x, yNum*y);
            x++;
            if(x == 20 || chars[i] == 10){
                if(y == 19){
                    y = 1;
                    x = 0;
                    g.dispose();
                    ImageIO.write(image,"jpg",new File("D:/"+number+".jpg"));
                    //String s = UploadUtils.novelUpload("dev", image, "chengliang", number + "");//上传到oss
                    //sb.append(s+",");
                    number++;
                    g = getGraphics(image);
                    continue;//加图
                }
                y++;
                x=0;
            }
            if(i == chars.length-1){
                g.dispose();
                ImageIO.write(image,"jpg",new File("D:/"+number+".jpg"));
                //String s = UploadUtils.novelUpload("dev", image, "chengliang", number + "");
                //sb.append(s);
                System.out.println(sb.toString());
            }
        }
        return sb.toString();
    }

    public static BufferedImage getImg(){
        return new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
    }

    public static Graphics getGraphics(BufferedImage bufferedImage){
        //Graphics g = bufferedImage.getGraphics();
        Graphics2D g = bufferedImage.createGraphics();
        g.setClip(0, 0, width, height);
        Color color = new Color(255, 255, 255,0);
        // 先用黑色填充整张图片,也就是背景
        g.setColor(color);
        g.fillRect(0, 0, width, height);
        // 在换成红色
        g.setColor(Color.black);
        // 设置画笔字体
        //如果服务器上没有对应的字体，可以用指定的字体，并设置字体大小
        //Font f = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream("/usr/share/fonts/dejavu/simhei.ttf"));
        //font = f.deriveFont(34.0f);
        g.setFont(new Font("黑体", Font.BOLD, fontSize));
        //去除字的锯齿
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        return g;
    }

    /**
     * 函 数 名: cut<br>
     * 功能描述：对图片裁剪，并把裁剪完蛋新图片保存 。 <br>
     * 输入输出:
     * @param x 开始剪切的x坐标
     * @param y 开始剪切的y坐标
     * @param width  需要剪切的宽
     * @param height 需啊剪切的高
     * @throws IOException
     * <br>
     */
    public static BufferedImage cut(String lastdir,BufferedImage inImg, int x, int y, int width,int height) throws IOException {
        ByteArrayOutputStream bs = new ByteArrayOutputStream();
        ImageIO.write(inImg,"jpg",bs);
        ByteArrayInputStream in = new ByteArrayInputStream(bs.toByteArray());
        ImageInputStream iis=   ImageIO.createImageInputStream(in);
        try {
            Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName(lastdir);
            ImageReader reader = it.next();
            reader.setInput(iis, true);
            ImageReadParam param = reader.getDefaultReadParam();
            /*
             * 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域，通过 Rectangle 对象
             * 的左上顶点的坐标（x，y）、宽度和高度可以定义这个区域。
             */
            Rectangle rect = new Rectangle(x, y, width, height+10);
            param.setSourceRegion(rect);
            BufferedImage bi = reader.read(0, param);
            return bi;
        } finally {
            if (in != null)
                in.close();
            if (bs != null)
                bs.close();
        }
    }

    public static void main(String[] args) throws Exception {
        double v = fontSize * rowSpace;
        int a = (int)(v);
        createImage("第1章 \n" +
                "　　我叫莫子洋，是莫家岭小山村出来的，初中毕业后，上不起高中，就跟着自家一个老叔倒腾铁矿，老叔一辈子无妻无儿，对我不错，后来他生病了，把所有的关系和人脉都传给了我，我一个人干，赚了不少钱，算是个小土豪。\n" +
                "　　做生意，靠的就是人脉，少不了应酬。\n" +
                "　　这天，我到市里去接见一个省里的客户，胡吃海喝之后，就是其他娱乐项目了。本想去嗨歌，客户却提议去洗浴中心。客户为上，我就跟了去。\n" +
                "　　洗浴结束，客户说酒也解了，饭了饱了，就是这旅途劳顿还没解，不如去楼上按按摩，放松放松。我只能陪着上楼去。\n" +
                "　　毕竟这货还没出手，合同还没签，我再不想去也得去啊。\n" +
                "　　在楼上的按摩间，按摩师嘁哩喀喳一阵按摩，你别说，还是挺舒服的。\n" +
                "　　按着按着，客户问道：“你们这里还有其他有偿服务吗？”\n" +
                "　　按摩师眉飞色舞的说道：“瞧您说的，肯定有啊，我们的服务宗旨就是客户至上，只要您有需求，我们就有服务。”说着还露出一个你懂的微笑。\n" +
                "　　“好好好，来几个，让哥们儿挑挑。”客户一听，色眯眯的说道。\n" +
                "　　“哥，这里不合适吧，要不，您跟我来？”\n" +
                "　　“有道理，走走走。”客户对我说，“子洋，那我……”\n" +
                "　　“您去吧，我在这里休息一会儿就好，您玩儿高兴了哈。”\n" +
                "　　看着客户踩着拖鞋出去，我有点无聊，就躺在椅子上，想眯一会儿。\n" +
                "　　“哐哐，”有人敲了一下门，走进来，问道，“哥，是你的叫的服务？”\n" +
                "　　声音细腻柔媚，听得我心里痒痒的，睁开眼睛一看，乖乖，走进来一个美女，穿的那叫一个性感火爆，齐臀小短裙，浑圆的屁股露出大半，两条大长腿，又细又长，腰很细，小短衣仅仅裹在胸前，露出白白的腰，胸前的凶器也有半个白球露在外面，脸上没有化妆，却干净好看。\n" +
                "　　看到她的脸，我就愣住了。她也吓了一跳，脸瞬间惨白。\n" +
                "　　因为，我俩认识。\n" +
                "　　“嫂子？”\n" +
                "　　“子洋？”\n" +
                "　　那错不了了，我俩同时叫出了对方的名字。她是我同村一个小伙伴莫正国的媳妇，燕子秋。\n" +
                "　　我俩瞬间都尴尬了，她结巴的说：“你，你，你怎么在，呵呵。”\n" +
                "　　“我陪客户来的啊，他非要玩儿，我又不能得罪他，只好在这里等他。”我赶紧解释了一下，下意识嘴贱问了一句，“嫂子你怎么在……”\n" +
                "　　我还没有说完，就想扇自己一巴掌，正国哥身体不太好，干不了重活，他们家里条件本来就不太好。燕子秋为了补贴家用，跟隔壁村的一个女的一起到城里打工，听说挣得还不少，到底是做什么工作，就没有人知道了。看来就是在这里打工做特殊服务了。\n" +
                "　　燕子秋还是回答了我的话，她低着头，脸红到脖子根，说道：“我，我在这里，我，那个，打，打工……”\n" +
                "　　“嫂子，我知道，我……”\n" +
                "　　这时候，服务生推门进来了，问：“哥，我们的美女怎么样？”\n" +
                "　　我更加尴尬了，燕子秋低着头，手想放在胸前，又不知道该不该放，腿微微夹着，也不知道这样该不该夹，总之有点手足无措的感觉。\n" +
                "　　服务生看我没有说话，赶紧介绍：“哥啊，难道你不满意吗？这位美女是我们这里口碑最好的，身材好，活好，最受欢迎的。”\n" +
                "　　原本我除了有点尴尬，还没觉得什么，可一听服务生的介绍，我的脑子轰炸了，只觉得体内有一股火气冲了起来，让我的身体不自觉有了反应。\n" +
                "　　是啊，怎么会没有反应呢？燕子秋是村里数一数二的漂亮小媳妇儿，我也是正常男人，还没结婚，又不愿意来这种地方解决生理问题。对燕子秋这个小媳妇儿怎么不幻想呢？我也曾不止一次幻想，要是能把燕子秋压在身下，那是一种什么感受？\n" +
                "　　尤其是距离这么近，她又穿的那么暴露，那个露出的半球，好大啊，要是握在手里，会是什么感觉？她的腿好长啊，要是架在肩上……\n" +
                "　　我不敢再想下去了，再想下去，我怕自己会丢丑。\n" +
                "　　“你还愣在这里干嘛呢？赶紧过去呀，还让哥叫你不成？”服务生看我不说话，以为我脸皮薄，赶紧对燕子秋说话。\n" +
                "　　“我……”我总不能说我不要她吧，这岂不是要砸了她的口碑，可我又不能说我要她吧，她是我嫂子，这岂不是更尴尬？\n" +
                "　　“哥，你放心，我们这里很安全的，也完全保护客户的隐私。你放心，她一定会让您满意的。”服务生说着，还冲我眨眨眼，一副你会知道妙处的那种表情。\n" +
                "　　我还想说话，却不知道该说什么，只好闭着嘴，抬头看着燕子秋。\n" +
                "　　“哈哈，哥，您慢慢享受哈，我就不打扰您了。”服务生说着扭头要走，看到燕子秋还站在那里，说道：“赶紧过去啊，愣着干什么呢？”\n" +
                "　　燕子秋低着头，红着脸，说：“哦。”然后向我走了过去。\n" +
                "　　服务生看着她走到我面前，这才笑了笑，颠颠的走出去，还哐当一声把门给锁上了。\n" +
                "　　只剩下我们两个人的时候，我们更加尴尬了，我嘴边有话，想说：“我没有点这种服务，是隔壁客户点的。”我又不敢说，怕一张嘴把人给得罪了，俩人就真的都下不来台了。\n" +
                "　　燕子秋比我强不了多少，想说什么，又不知道说什么，吱吱呜呜的说：“子，子洋啊，那个，那个，你，你看，我，我们，该，该……”\n" +
                "　　我知道我们俩要是一直这么纠结，这么尴尬，也不是个事情，反正两个人熟人在这里相遇了，一定得说清楚某些话的，不如我就先说吧。\n" +
                "　　我看着燕子秋，问道：“嫂子，你怎么会来做这种工作呢？”");

    }
}
